package qc.module.ehs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.enums.EhsTaskDestObjectTypeEnum;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.module.ehs.dto.taskcategory.TaskCategoryDto;
import qc.module.ehs.dto.taskcategory.TaskCategoryQueryConditionDto;
import qc.module.ehs.entity.EhsTaskCategory;
import qc.module.ehs.mapper.EhsTaskCategoryMapper;
import qc.module.ehs.repository.EhsTaskCategoryRepository;

import java.util.List;
import java.util.Objects;

/**
 * 任务分类信息接口Service
 *
 * @author QuCheng Tech
 * @create 2024/9/25
 */
@Service
public class EhsTaskCategoryService {

    @Autowired
    private EhsTaskCategoryRepository repository;

    /**
     * 获取指定组织编码下的所有任务分类
     *
     * @param orgCode 组织代码
     * @return List<TaskCategoryDto>
     * @author QuCheng Tech
     * @since 2024/9/25
     */
    public List<TaskCategoryDto> getAll(String orgCode) {
        LambdaQueryWrapper<EhsTaskCategory> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsTaskCategory::getOrgcode, orgCode);
        List<EhsTaskCategory> ens = repository.selectList(wrapper);

        if (CollectionUtils.isNotEmpty(ens)) {
            return EhsTaskCategoryMapper.MAPPER.toDtoList(ens);
        }
        return null;
    }

    /**
     * 获取指定
     *
     * @param catCode 分类代码
     * @return TaskCategoryDto
     * @author QuCheng Tech
     * @since 2024/9/25
     */
    public TaskCategoryDto get(String catCode) {
        EhsTaskCategory en = repository.selectById(catCode);

        if (Objects.nonNull(en)) {
            return EhsTaskCategoryMapper.MAPPER.toDto(en);
        }
        return null;
    }

    /**
     * 新增
     *
     * @param dto 任务分类信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/9/25
     */
    public String add(TaskCategoryDto dto) {
        //1.DTO有效性验证
        if (dto == null)
            return QCUnifyReturnValue.Warn("新增DTO不能为空");
        if (StringUtils.isBlank(dto.getCatcode()))
            return QCUnifyReturnValue.Warn("分类代码不能为空");
        if (StringUtils.isBlank(dto.getCatname()))
            return QCUnifyReturnValue.Warn("分类名称不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            return QCUnifyReturnValue.Warn("所属组织代码不能为空");

        //2.保存数据
        EhsTaskCategory en = EhsTaskCategoryMapper.MAPPER.dtoToEntity(dto);

        //转换为Entity后再判断必填项是否有数据，数据是否有效
        if (en.getTasktype() == null)
            return QCUnifyReturnValue.Warn("任务大类不能为空");
        if (en.isNotnull()) {
            if (en.getObjtype() == null || en.getObjtype() == EhsTaskDestObjectTypeEnum.UNDEFINED)
                return QCUnifyReturnValue.Warn("请选择关联的对象类型");
        }

        if (repository.insert(en) < 0x1) {
            return QCUnifyReturnValue.Warn("保存任务分类失败");
        }
        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改
     *
     * @param dto 任务分类信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/9/25
     */
    public String update(TaskCategoryDto dto) {
        //1.DTO有效性验证
        if (dto == null)
            return QCUnifyReturnValue.Warn("新增DTO不能为空");
        if (StringUtils.isBlank(dto.getCatcode()))
            return QCUnifyReturnValue.Warn("分类代码不能为空");
        if (StringUtils.isBlank(dto.getCatname()))
            return QCUnifyReturnValue.Warn("分类名称不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            return QCUnifyReturnValue.Warn("所属组织代码不能为空");

        //验证修改对象是否存在
        EhsTaskCategory category = repository.selectById(dto.getCatcode());
        if (Objects.isNull(category))
            return QCUnifyReturnValue.Warn("修改的分类信息不存在");

        //2.保存数据
        EhsTaskCategory en = EhsTaskCategoryMapper.MAPPER.dtoToEntity(dto);
        //转换为Entity后再判断必填项是否有数据，数据是否有效
        if (en.getTasktype() == null)
            return QCUnifyReturnValue.Warn("任务大类不能为空");
        if (en.isNotnull()) {
            if (en.getObjtype() == null || en.getObjtype() == EhsTaskDestObjectTypeEnum.UNDEFINED)
                return QCUnifyReturnValue.Warn("请选择关联的对象类型");
        }

        repository.updateById(en);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除
     *
     * @param catCode 任务分类代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/9/25
     */
    public String delete(String catCode) {
        repository.deleteById(catCode);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 查询指定条件的任务分类集合
     *
     * @param condition 查询条件
     * @return java.util.List<qc.module.ehs.dto.taskcategory.TaskCategoryDto>
     * @author QuCheng Tech
     * @since 2024/10/23
     */
    public List<TaskCategoryDto> query(TaskCategoryQueryConditionDto condition) throws QCPromptException {
        //如果查询条件为空，抛出异常提示
        if (condition == null)
            throw new QCPromptException("查询条件对象不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("查询条件中所属组织代码不能为空");
        //获取关联的对象类型，要求对象类型必须指定且有效
        EhsTaskDestObjectTypeEnum objectTypeEnum = getEhsTaskRelateObjectTypeEnum(condition.getObjecttype());
        if (objectTypeEnum == EhsTaskDestObjectTypeEnum.UNDEFINED)
            throw new QCPromptException("查询条件中对象不能为空或指定错误");

        LambdaQueryWrapper<EhsTaskCategory> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsTaskCategory::getOrgcode, condition.getOrgcode());
        wrapper.eq(EhsTaskCategory::getObjtype, objectTypeEnum);
        List<EhsTaskCategory> ens = repository.selectList(wrapper);

        if (CollectionUtils.isNotEmpty(ens)) {
            return EhsTaskCategoryMapper.MAPPER.toDtoList(ens);
        }
        return null;
    }

    /**
     * 根据枚举key获取任务关联对象类型枚举
     *
     * @param index
     * @return
     */
    static EhsTaskDestObjectTypeEnum getEhsTaskRelateObjectTypeEnum(Integer index) {
        if (index != null && index > 0x0) {
            for (EhsTaskDestObjectTypeEnum item : EhsTaskDestObjectTypeEnum.values()) {
                if (item.getIndex() == index) {//判断序号使用getIndex，判断内容使用getName
                    return item;
                }
            }
        }
        return EhsTaskDestObjectTypeEnum.UNDEFINED;
    }
}
